/**
 * 研发资源管理业务逻辑
 */
// 直接导入相关模块
const ProjectHelpers = require('../../../config/project_helpers_config');
const cloudHelper = ProjectHelpers.cloudHelper;
const dateHelper = ProjectHelpers.timeHelper; // timeHelper包含date_helper功能
// 修复路径，正确指向研发状态业务逻辑文件
const ResearchStateBiz = require('../research_state_biz.js');
// 使用简单实现替代UserBiz
const UserBiz = {
  isAdmin: (user) => user && user.IS_ADMIN
};
// 使用空对象模拟testHelper，避免引用不存在的文件
const testHelper = ProjectHelpers.testHelper || {
  isDebugModeEnabled: () => false,
  hasAnyRole: () => false
};

/**
 * 资源类型定义
 */
const RESOURCE_TYPES = {
  DOC: 'doc',      // 文档
  PCB: 'pcb',      // PCB
  BOM: 'bom',      // BOM清单
  SOFTWARE: 'software', // 软件
  IMAGE: 'image',  // 图片
};

/**
 * 格式化资源列表项
 * @param {Array} list 资源列表
 * @returns {Array} 格式化后的列表
 */
function formatResourceList(list) {
  if (!list || !list.length) return [];
  
  return list.map(item => {
    // 添加资源类型名称
    item.RESOURCE_TYPE_NAME = getResourceTypeName(item.RESOURCE_TYPE);
    
    // 格式化时间
    if (item.ADD_TIME) {
      item.ADD_TIME_DISPLAY = dateHelper.format(item.ADD_TIME);
    }
    
    // 添加文件类型图标
    item.FILE_ICON = getFileIcon(item.RESOURCE_URL || '');
    
    return item;
  });
}

/**
 * 获取资源类型名称
 * @param {String} type 资源类型
 * @returns {String} 类型名称
 */
function getResourceTypeName(type) {
  const typeMap = {
    [RESOURCE_TYPES.DOC]: '文档',
    [RESOURCE_TYPES.PCB]: 'PCB',
    [RESOURCE_TYPES.BOM]: 'BOM',
    [RESOURCE_TYPES.SOFTWARE]: '软件',
    [RESOURCE_TYPES.IMAGE]: '图片'
  };
  
  return typeMap[type] || '其他';
}

/**
 * 根据文件扩展名获取图标
 * @param {String} url 文件URL
 * @returns {String} 图标类名
 */
function getFileIcon(url) {
  if (!url) return 'icon-file';
  
  const ext = url.split('.').pop().toLowerCase();
  
  // 图片
  if (['jpg', 'jpeg', 'png', 'gif', 'bmp'].includes(ext)) {
    return 'icon-image';
  }
  
  // 文档
  if (['doc', 'docx', 'pdf'].includes(ext)) {
    return 'icon-doc';
  }
  
  // 表格
  if (['xls', 'xlsx', 'csv'].includes(ext)) {
    return 'icon-table';
  }
  
  // 演示文稿
  if (['ppt', 'pptx'].includes(ext)) {
    return 'icon-ppt';
  }
  
  // 代码
  if (['js', 'py', 'java', 'c', 'cpp', 'h'].includes(ext)) {
    return 'icon-code';
  }
  
  // 压缩包
  if (['zip', 'rar', '7z'].includes(ext)) {
    return 'icon-zip';
  }
  
  // 默认
  return 'icon-file';
}

/**
 * 检查是否有资源上传权限
 * @param {Object} project 项目信息
 * @param {Object} user 用户信息
 * @returns {Object} 包含是否有权限以及原因
 */
function hasResourceUploadPermission(project, user) {
  // 测试模式下，直接返回有权限
  if (testHelper.isDebugModeEnabled()) {
    // 研发经理、管理员、硬件工程师和软件工程师有上传权限
    if (testHelper.hasAnyRole(['admin', 'research_manager', 'hardware_engineer', 'software_engineer'])) {
      return {
        hasPermission: true,
        reason: '测试模式：允许上传资源'
      };
    }
  }

  // 默认没有权限
  const result = {
    hasPermission: false,
    reason: '无权上传资源'
  };

  if (!project || !user) {
    result.reason = '项目或用户信息不完整';
    return result;
  }

  // 1. 基于项目状态的控制
  const projectStatus = project.PROJECT_STATUS || 0;
  
  // 在待立项(0)和已完成(99)状态下禁止上传资源
  if (projectStatus === ResearchStateBiz.PROJECT_STATUS.PENDING) {
    result.reason = '待立项状态下不能上传资源';
    return result;
  }
  
  if (projectStatus === ResearchStateBiz.PROJECT_STATUS.COMPLETED) {
    result.reason = '项目已完成，不能上传资源';
    return result;
  }

  // 2. 基于用户角色的控制
  const isAdmin = UserBiz.isAdmin(user);
  const isProjectOwner = user._id === project.USER_ID;
  const isProjectMember = project.PROJECT_MEMBERS && project.PROJECT_MEMBERS.includes(user._id);
  
  // 管理员、项目创建者和项目成员可以上传资源
  if (isAdmin || isProjectOwner || isProjectMember) {
    result.hasPermission = true;
    result.reason = '';
    return result;
  }

  result.reason = '您不是项目成员，无法上传资源';
  return result;
}

// 导出
module.exports = {
  RESOURCE_TYPES,
  formatResourceList,
  getResourceTypeName,
  getFileIcon,
  hasResourceUploadPermission
}; 